home *** CD-ROM | disk | FTP | other *** search
Text File | 1991-06-21 | 2.7 KB | 118 lines | [TEXT/MPS ] |
-
- UNIT ReturnOpens;
-
- INTERFACE
- USES
- MemTypes, QuickDraw, OSIntf, ToolIntf, PackIntf, Traps, Processes,MemEnd;
-
- PROCEDURE InitMain;
- IMPLEMENTATION
-
- PROCEDURE CallGOSE; INLINE $2253,$2848,$4e91,$2f00;
- PROCEDURE RestoreA0D0; INLINE $201f, $204c;
-
-
- PROCEDURE MyGOSE; FORWARD;
-
- FUNCTION FindPSNByType(processSig:ResType; VAR thePSN:ProcessSerialNumber):BOOLEAN; FORWARD;
- FUNCTION IsDialogWindow:BOOLEAN; FORWARD;
-
-
- PROCEDURE InitMain;
- VAR
- savedGOSEAddrPtr :^LONGINT;
- copySize :LONGINT;
- reloc :Ptr;
- BEGIN
- copySize := LONGINT(@MyMemory)-LONGINT(@MyGOSE);
- reloc := NewPtrSys(copySize+32);
- IF reloc = NIL THEN EXIT(InitMain);
- BlockMove(@MyGOSE, reloc, copySize);
- Ptr(savedGOSEAddrPtr) := Ptr(LONGINT(reloc)+copySize);
-
- savedGOSEAddrPtr^ := NGetTrapAddress($A031,OSTrap);
- NSetTrapAddress(LONGINT(reloc),$A031,OSTrap);
- END; {InitMain}
-
- PROCEDURE MyGOSE;
- LABEL 999;
- CONST
- cmdKeyBit = 0;
- VAR
- savedGOSEAddrPtr :^LONGINT;
- aPSN,bPSN,cPSN :ProcessSerialNumber;
- aQ :EvQElPtr;
- err :OSErr;
- erp :^EventRecord;
- BEGIN
- savedGOSEAddrPtr := @MyMemory;
- CallGOSE;
-
- IF erp^.what <> keyDown THEN goto 999;
- IF CHAR(BAND(erp^.message,$FF)) <> CHR($0D) THEN goto 999;
-
- IF NOT FindPSNByType('MACS',aPSN) THEN goto 999;
- err := GetFrontProcess(bPSN);
- err := GetCurrentProcess(cPSN);
- IF (aPSN.highLongOfPSN <> bPSN.highLongOfPSN) OR
- (aPSN.lowLongOfPSN <> bPSN.lowLongOfPSN) OR
- (aPSN.highLongOfPSN <> cPSN.highLongOfPSN) OR
- (aPSN.lowLongOfPSN <> cPSN.lowLongOfPSN) THEN goto 999;
-
- IF IsDialogWindow THEN goto 999;
-
- erp^.what := keyDown;
- (* BSET(LONGINT(erp^.modifiers,cmdKeyBit); *)
- erp^.message := LONGINT('o');
- erp^.modifiers := BOr(erp^.modifiers, 256+128);
-
- (*
- err := PPostEvent(keyDown,LONGINT('o'),aQ);
- BSET(LONGINT(aQ^.evtQModifiers),cmdKeyBit);
- *)
-
- 999: RestoreA0D0;
- END; {MyGOSE}
-
-
- FUNCTION FindPSNByType(processSig:ResType; VAR thePSN:ProcessSerialNumber):BOOLEAN;
- VAR
- info: ProcessInfoRec;
- fSpec: FSSpec;
- psn: ProcessSerialNumber;
- tempBool: Boolean;
- BEGIN
- tempBool := FALSE; {not yet!}
-
- info.processInfoLength := sizeof(ProcessInfoRec);
- info.processName := nil;
- info.processAppSpec := @fSpec;
- psn.highLongOfPSN := 0;
- psn.lowLongOfPSN := kNoProcess;
-
- WHILE (GetNextProcess(psn) = noErr) DO
- BEGIN
- IF (GetProcessInformation(psn, info) = noErr) THEN
- BEGIN
- IF (info.processSignature = processSig) THEN
- BEGIN
- thePSN := psn;
- tempBool := TRUE;
- END;
- END;
- END;
-
- FindPSNByType := tempBool;
- END; {FindPSNByType}
-
- FUNCTION IsDialogWindow:BOOLEAN;
- VAR aWind,bWind :WindowPeek;
- BEGIN
- aWind := WindowPeek(FrontWindow);
- IF POS('Desktop',aWind^.titleHandle^^) = 1 THEN
- IsDialogWindow := FALSE
- ELSE
- IsDialogWindow := NOT aWind^.spareFlag;
- END; {IsDialogWindow}
-
- END.